package org.opu.vcforms.template;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Arrays;
import org.opu.doc2db.document.datadocument.SimpleDocumentGenerator;
import org.opu.doc2db.document.datadocument.TableCell;
import org.opu.doc2db.document.datadocument.TextBlock;
import org.opu.doc2db.document.datadocument.TextParagraph;
import org.opu.doc2db.document.datadocument.Document;
import org.opu.doc2db.document.datadocument.Metric;
import org.opu.doc2db.document.datadocument.ParagraphList;
import org.opu.doc2db.document.datadocument.Table;
import org.opu.doc2db.document.datadocument.TableRow;
import org.opu.doc2db.document.datadocument.io.DefaultDocumentReader;
import org.opu.doc2db.document.datadocument.io.DefaultDocumentWriter;
import org.opu.doc2db.document.datadocument.io.DocumentReader;
import org.opu.doc2db.document.datadocument.io.DocumentWriter;
import org.opu.vcforms.template.bean.Content;
import org.opu.vcforms.template.bean.SmartTable;
import org.opu.vcforms.template.bean.Var;

/**
 * Template main class
 * @author Dunko Yuriy
 *
 */
public class App extends SimpleDocumentGenerator {

    public static void main(String[] args) throws IOException {
        /*
        Document doc = getF1();

        DocumentWriter w = new DefaultDocumentWriter(doc);
        w.write(new File("/home/yura/Desktop/doc3.xml"));

        DocumentReader r = new DefaultDocumentReader();
        doc = r.parseDocument(new File("/home/yura/Desktop/doc3.xml"));

        w.write(new File("/home/yura/Desktop/doc4.xml"));
        //*/
    }

    public static Document getF1(){
        Document doc = new Document();

        Content sett = new Content(Content.TYPE_USER_SETTINGS);
        sett.set(Content.PROPERYY_SETTINGS_TYPE, "groups");
        sett.elementsAdd(toPar("                                                      ФОРМА С-21"));
        sett.elementsAdd(toPar("           ОДЕСЬКИЙ НАЦІОНАЛЬНИЙ ПОЛІТЕХНІЧНИЙ УНІВЕРСІТЕТ      "));
        sett.elementsAdd(toPar(""));

        TextParagraph inistPar = toPar("  ІНСТИТУТ (ФАК-Т) ");
        inistPar.elementsAdd(toVar(Var.REGULAT + "Facultet", null, Var.TYPE_SETTINGS));
        sett.elementsAdd(inistPar);

        TextParagraph semestr = toPar("  Навчальний рiк ________________                      Семестр    ");
        semestr.elementsAdd(toVar(Var.REGULAT + "Semestr", null, Var.TYPE_SETTINGS));
        sett.elementsAdd(semestr);

        Content specNaprSql = new Content(Content.TYPE_DATABASE);
        specNaprSql.set(Content.PROPERYY_SQL, "SELECT sp.spec_id  as napravlenie, "
                + " replace(назвподр,'НАВЧАЛЬНО\\-НАУКОВИЙ ','') as facultet"
                + " from gruppa g, sveduch s, special_gruppa sp, podrazdelenie p"
                + " where g.группа~'" + Content.CALL_SUPER + Content.CALL_NEXT
                + "' and g.номер=s.номер "//АН011
                + " and s.спец_ть=sp.spec_id limit (1);");

        TextParagraph naprPar = toPar("  Напрям пiдготовки ");
        naprPar.elementsAdd(toVar(Var.CONTENT_CALL_NEXT, null, Var.TYPE_CONTENT));
        naprPar.elementsAdd(new TextBlock("   Курс       "));
        naprPar.elementsAdd(toVar(Var.REGULAT + "Course", null, Var.TYPE_SETTINGS));
        specNaprSql.elementsAdd(naprPar);

        TextParagraph specPar = toPar("  Спецiальнiсть ");
        specPar.elementsAdd(toVar(Var.CONTENT_CALL_NEXT, null, Var.TYPE_CONTENT));
        specPar.elementsAdd(new TextBlock("   Группа     "));
        specPar.elementsAdd(toVar(Var.REGULAT + Content.CALL_SUPER + Content.CALL_GET, null, Var.TYPE_CONTENT));
        specPar.elementsAdd(toVar(Var.CONTENT_CALL_STEP, null, Var.TYPE_CONTENT));
        specNaprSql.elementsAdd(specPar);

        sett.elementsAdd(specNaprSql);
        sett.elementsAdd(toPar(""));
        sett.elementsAdd(toPar("	             ВІДОМІСТЬ ОБЛІКУ УСПІШНОСТІ N_____"));
        sett.elementsAdd(toPar(""));
        sett.elementsAdd(toPar("  Дисциплiна ____________________________________________________"));
        sett.elementsAdd(toPar(""));
        sett.elementsAdd(toPar("  Пiдсумкову оцiнку виставив ____________________________________"));
        sett.elementsAdd(toPar(""));
        sett.elementsAdd(toPar("  Поточний контроль здiйснив  ___________________________________"));
        sett.elementsAdd(toPar(""));

        SmartTable table = new SmartTable();
        TableRow tr1 = new TableRow();
        tr1.elementsAdd(toCel(m(3), toPar(" N "), toPar(" П/"), toPar(" П ")));
        tr1.elementsAdd(toCel(m(20), toPar("                    "), toPar("  ПРIЗВИЩЕ IНIЦIАЛИ "), toPar("     СТУДЕНТА       ")));
        tr1.elementsAdd(toCel(m(8), toPar(" N% IНД."), toPar(" НАВЧ.  "), toPar(" ПЛАНУ  ")));
        TableCell c4 = toCel(m(29), toPar("      ПIДСУМКОВА ОЦIНКА      "), toPar("          ЗА ШКАЛОЮ          "));
        c4.setHsplit(3);
        tr1.elementsAdd(c4);
        tr1.elementsAdd(toCel(m(9), toPar(" ПIДПИС"), toPar("ВИКЛАДАЧА")));
        table.elementsAdd(tr1);

        TableRow tr2 = new TableRow();
        tr2.elementsAdd(contencCell(3, null, false));
        tr2.elementsAdd(contencCell(20, null, false));
        tr2.elementsAdd(contencCell(8, null, false));
        tr2.elementsAdd(toCel(m(17), toPar("    Стобальною   ")));
        tr2.elementsAdd(toCel(m(6), toPar("Чотири"), toPar("бальн.")));
        tr2.elementsAdd(toCel(m(4), toPar("ECTS")));
        tr2.elementsAdd(contencCell(9, null, false));
        table.elementsAdd(tr2);

        Content tableContent = new Content(Content.TYPE_DATABASE);
        tableContent.set(Content.PROPERYY_SQL, "SELECT fio, nomer from student_list "
                + "where \"group\"='" + Content.CALL_SUPER + Content.CALL_GET + "'");

        TableRow tr3 = new TableRow();
        tr3.elementsAdd(contencCell(3, Var.CONTENT_CALL_ITERATION, true));
        tr3.elementsAdd(contencCell(20, Var.CONTENT_CALL_NEXT, true));
        TextParagraph unicNom = toPar(" ");
        unicNom.elementsAdd(toVar(Var.CONTENT_CALL_NEXT, null, Var.TYPE_CONTENT));
        tr3.elementsAdd(toCel(m(8), unicNom));
        tr3.elementsAdd(toCel(m(17), toPar("")));
        tr3.elementsAdd(toCel(m(6), toPar("")));
        tr3.elementsAdd(toCel(m(4), toPar("")));
        tr3.elementsAdd(contencCell(9, Var.CONTENT_CALL_STEP, true));

        tableContent.elementsAdd(tr3);

        table.elementsAdd(tableContent);
        
        sett.elementsAdd(table);
        sett.elementsAdd(toPar(""));
        sett.elementsAdd(toPar("          Шкала оцiнювання"));

        Table table2 = toTable(
                toRow(
                    toCel(m(9), toPar("Стобальна")),
                    toCel(m(6), toPar("Чотири"), toPar("бальна")),
                    toCel(m(4), toPar("ECTS")),
                    toCel(m(13), toPar("   Назва     ")),
                    cell(34, false, toPar(""), toPar("      Дата____________"))),
                toRow(
                    toCel(m(9), toPar(" 95-100  ")),
                    toCel(m(6), toPar("  5   ")),
                    toCel(m(4), toPar(" A  ")),
                    toCel(m(13), toPar("відмінно")),
                    cell(34, false, toPar(""), toPar("      Директор(Декан)_____________"))),
                toRow(
                    toCel(m(9), toPar(" 85-94  ")),
                    toCel(m(6), toPar("  4   ")),
                    toCel(m(4), toPar(" B  ")),
                    toCel(m(13), toPar("дуже добре")),
                    contencCell(34, null, false)),
                toRow(
                    toCel(m(9), toPar(" 75-84  ")),
                    toCel(m(6), toPar("  4   ")),
                    toCel(m(4), toPar(" C  ")),
                    toCel(m(13), toPar("добре")),
                    contencCell(34, null, false)),
                toRow(
                    toCel(m(9), toPar(" 65-74  ")),
                    toCel(m(6), toPar("  3   ")),
                    toCel(m(4), toPar(" D  ")),
                    toCel(m(13), toPar("задовiльно")),
                    contencCell(34, null, false)),
                toRow(
                    toCel(m(9), toPar(" 60-64  ")),
                    toCel(m(6), toPar("  3   ")),
                    toCel(m(4), toPar(" E  ")),
                    toCel(m(13), toPar("достатньо")),
                    contencCell(34, null, false)),
                toRow(
                    toCel(m(9), toPar(" 30-59  ")),
                    toCel(m(6), toPar("  2   ")),
                    toCel(m(4), toPar(" FX ")),
                    toCel(m(13), toPar("не задовiльно")),
                    contencCell(34, null, false)),
                toRow(
                    toCel(m(9), toPar("  < 30  ")),
                    toCel(m(6), toPar("  2   ")),
                    toCel(m(4), toPar(" F  ")),
                    toCel(m(13), toPar("не задовiльно")),
                    contencCell(34, null, false))
                );

        sett.elementsAdd(table2);
        sett.elementsAdd(toParVar(toVar(Var.CONTENT_CALL_STEP, null, Var.TYPE_CONTENT)));

        doc.elementsAdd(sett);

        return doc;
    }

    public static Metric<Integer> m(int value){
        return new Metric<Integer>(value);
    }

    public static Document getTestExample() {
        Document doc = new Document();

        Content content2 = new Content(Content.TYPE_DATABASE);
        content2.set(Content.PROPERYY_SQL, "Select * from sudent");

        TableCell c1 = toCel(toParVar(toVar("next", null, Var.TYPE_CONTENT)));
        TableCell c2 = toCel(toParVar(toVar("next", null, Var.TYPE_CONTENT)));
        TableCell c3 = toCel(toParVar(toVar("next", null, Var.TYPE_CONTENT),
                toVar("step", null, Var.TYPE_CONTENT)));

        content2.elementsAdd(toRow(c1, c2, c3));

        doc.elementsAdd(toParVar(toVar("text1", null, null)));
        doc.elementsAdd(toParVar(toVar("text1", null, null, "name", "value")));
        doc.elementsAdd(toPar("text 2.1", " text 2.2"));

        SmartTable st = toTable(
                toRow(toCel(new Metric<Integer>(10, "cell11"), toPar("h1")),
                toCel(new Metric<Integer>(20), toPar("2h")),
                toCel(new Metric<Integer>(30, "cell13"), toPar("h3"))),
                content2);

        Content content = new Content(Content.TYPE_USER_SETTINGS);
        content.set(Content.PROPERYY_SETTINGS_TYPE, "groups");
        content.elementsAdd(toPar("content text"));
        content.elementsAdd(st);

        doc.elementsAdd(content);
        doc.elementsAdd(toPar("last text"));

        return doc;
    }

    public static TextParagraph toParVar(Var... t) {
        return new TextParagraph(asList(t));
    }

    public static Var toVar(String text, String format, String type) {
        format = format != null ? format : Var.DEFAULT_FORMAT;
        type = type != null ? type : Var.TYPE_TEXT;
        return new Var(new TextBlock(text), format, type);
    }

    public static Var toVar(String text, String format, String type, String... prop) {
        Var var = toVar(text, format, type);

        for (int i = 0; i + 1 < prop.length; i += 2) {
            var.setProperty(prop[i], prop[i + 1]);
        }

        return var;
    }

    public static Collection<TextBlock> asList(Var... t) {
        ArrayList<TextBlock> list = new ArrayList<TextBlock>(t.length);
        list.addAll(Arrays.asList(t));
        return list;
    }

    public static SmartTable toTable(ParagraphList... t) {
        return new SmartTable(Arrays.asList(t));
    }

    public static TableCell contencCell(int width, String text, boolean v){
        TextParagraph par = text != null
                ? toParVar(toVar(text, null, Var.TYPE_CONTENT))
                : toPar("");
        TableCell c = toCel(m(width), par);
        c.setVisible(v);
        return c;
    }

    public static TableCell cell(int width, boolean v, TextParagraph... par){
        TableCell c = toCel(m(width), par);
        c.setVisible(v);
        return c;
    }
}
